Wang Haihua
🍈 🍉🍊 🍋 🍌
Python中我们常用Numpy库进行数组生成和函数运算. 我们可以通过在命令行提示符cmd(对于Windows系统)或者终端Terminal(对于Mac系统)使用下述命令安装Numpy:
pip install numpy
如果已经是使用Anaconda作为编程集成环境,那电脑中已经装好该库了,无需再次安装。
一般我们在使用该库时会将该库简写为np
import numpy as np
array¶Numpy的基本数据类型为array,类似于Python的数据结构list但要比list强大。
array¶可以通过列表生成array
>>>np.array([1,2,3])
array(1,2,3)
也可以生成多维数组
>>>np.array([[1,2,3],[4,5,6]]) # 生成2行3列数组
array([[1, 2, 3],
     [4, 5, 6]])
linspace arange¶可以通过指定元素个数生成等差数列
>>>np.linspace(1,10,5) # 生成起点为首项为1,末项为10,共5项的等差数列
array([ 1.  ,  3.25,  5.5 ,  7.75, 10.  ])
也可以指定公差生成等差数列
>>>np.arange(1,10,2) # 生成首项为1,公比为2,末项小于10的等差数列
array([1, 3, 5, 7, 9])
>>>a = np.array([[1,2,3],[4,5,6]]) 
>>>a.shape # 查看数组形状
(2,3)
>>>a.size # 查看数组元素个数
6
还可以对数组进行变形,比如对上述数组可以变成3行2列
>>>a.reshape((3,2)) # 查看数组形状
array([[1, 2],
     [3, 4],
     [5, 6]])
>>>a = np.array([[1,2,3],[4,5,6]]) 
>>>a[1,2] # 提取a第2行第3列元素
6
>>>a[:,2] # 提取a第3列元素,:代表'所有'
array([3, 6])
>>>a[:,[1,2]] # 提取a第2、3列元素
array([[2, 3],
     [5, 6]])
>>>a = np.array([[1,2,3],[4,5,6]]) 
>>>a[a>2] # 提取a中大于2的数据
array([3, 4, 5, 6])
>>>a[(a>2)&(a<6)] # 提取a中大于2且小于6的数据
array([3, 4, 5])
Numpy中的通用函数ufuncs很强大,相比于Python自带的math库中的函数,往往可以同时处理数组和列表中的所有元素,举例来说
>>>import math
>>>import numpy as np
>>>math.log(20) # 求20的自然对数
2.995732273553991
>>>np.log(20)
2.995732273553991
>>>math.log([1,2,3]) # 报错,无法同时对1,2,3求对数
TypeError                                 Traceback (most recent call last)
<ipython-input-17-2d751dc5cabe> in <module>
----> 1 math.log([1,2,3])
TypeError: must be real number, not list
>>>np.log([1,2,3])
array([0.        , 0.69314718, 1.09861229])
以上仅是距离,常用函数在Numpy中基本都可以找到。
Numpy中有linalg模块专门处理矩阵的相关运算。
>>>np.eye(3) # 生成单位矩阵
array([[1., 0., 0.],
     [0., 1., 0.],
     [0., 0., 1.]])
>>>np.diag([1,2,3,4]) # 生成对角矩阵
array([[1, 0, 0, 0],
     [0, 2, 0, 0],
     [0, 0, 3, 0],
     [0, 0, 0, 4]])
>>>np.zeros((3,4)) #生成3行4列的全0矩阵
array([[0., 0., 0., 0.],
     [0., 0., 0., 0.],
     [0., 0., 0., 0.]])
>>>A = np.array([[1,3,2],[4,1,5],[3,3,1]]) # 生成3行3列矩阵
array([[1, 3, 2],
     [4, 1, 5],
     [3, 3, 1]])
>>>B = np.array([[3,3,1],[5,2,6],[1,2,3]]) # 生成3行3列矩阵
array([[3, 3, 1],
     [5, 2, 6],
     [1, 2, 3]])
>>>A+B # 矩阵加法
array([[ 4,  6,  3],
     [ 9,  3, 11],
     [ 4,  5,  4]])
>>>A-B # 矩阵减法
array([[-2,  0,  1],
     [-1, -1, -1],
     [ 2,  1, -2]])
>>>A@B # 矩阵乘法,注意不是*
array([[20, 13, 25],
     [22, 24, 25],
     [25, 17, 24]])
>>>np.linalg.inv(A) # 矩阵A的逆
array([[-0.37837838,  0.08108108,  0.35135135],
     [ 0.2972973 , -0.13513514,  0.08108108],
     [ 0.24324324,  0.16216216, -0.2972973 ]])
>>>np.linalg.det(A) # A的行列式
37.000000000000014
>>>values,vectors = np.linalg.eig(A) # A的特征值与特征向量
>>>values # 特征值
array([ 7.59286438, -1.66349894, -2.92936543])
>>>vectors # 特征向量
array([[-0.47899104, -0.80079204,  0.50689474],
     [-0.69615171,  0.4402157 , -0.82670395],
     [-0.53473393,  0.40613082,  0.2441686 ]])
import numpy as np
np.array([1,2,3])
array([1, 2, 3])
np.linspace(1,10,5)
array([ 1. , 3.25, 5.5 , 7.75, 10. ])
np.arange(1,10,2)
array([1, 3, 5, 7, 9])
np.array([[1,2,3],[4,5,6]])
array([[1, 2, 3],
       [4, 5, 6]])
a = np.array([[1,2,3],[4,5,6]]) 
a.reshape((3,2))
array([[1, 2],
       [3, 4],
       [5, 6]])
a[:,2]
array([3, 6])
a[:,[1,2]]
array([[2, 3],
       [5, 6]])
a[a>2]
array([3, 4, 5, 6])
a[(a>2)&(a<6)]
array([3, 4, 5])
import math
math.log(20)
2.995732273553991
math.log([1,2,3])
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-17-2d751dc5cabe> in <module> ----> 1 math.log([1,2,3]) TypeError: must be real number, not list
np.log([1,2,3])
array([0. , 0.69314718, 1.09861229])
np.eye(3)
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])
np.diag([1,2,3,4])
array([[1, 0, 0, 0],
       [0, 2, 0, 0],
       [0, 0, 3, 0],
       [0, 0, 0, 4]])
np.zeros((3,4))
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
A=np.array([[1,3,2],[4,1,5],[3,3,1]])
B=np.array([[3,3,1],[5,2,6],[1,2,3]])
A+B
array([[ 4,  6,  3],
       [ 9,  3, 11],
       [ 4,  5,  4]])
A-B
array([[-2,  0,  1],
       [-1, -1, -1],
       [ 2,  1, -2]])
A@B
array([[20, 13, 25],
       [22, 24, 25],
       [25, 17, 24]])
np.linalg.inv(A)
array([[-0.37837838,  0.08108108,  0.35135135],
       [ 0.2972973 , -0.13513514,  0.08108108],
       [ 0.24324324,  0.16216216, -0.2972973 ]])
np.linalg.det(A)
37.000000000000014
values,vectors = np.linalg.eig(A)
values
array([ 7.59286438, -1.66349894, -2.92936543])
vectors
array([[-0.47899104, -0.80079204,  0.50689474],
       [-0.69615171,  0.4402157 , -0.82670395],
       [-0.53473393,  0.40613082,  0.2441686 ]])